package com.kfm.storage.watcher;

import java.io.*;
import java.net.Socket;

/**
 * @author Aurora雪
 */
public class SyncFile {
    public static void syncFile(String localFilePath, String remoteIpAddress, int remotePort) {
        // 创建一个线程用来同步文件到远程服务器
        Thread syncFileThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 创建Socket连接到远程服务器
                    try (Socket socket = new Socket(remoteIpAddress, remotePort)) {
                        // 创建文件输入流
                        InputStream fileInputStream = new FileInputStream(localFilePath);

                        // 获取Socket的输出流
                        OutputStream outputStream = socket.getOutputStream();

                        // 获取文件名和后缀
                        File file = new File(localFilePath);
                        String fileName = file.getName();
                        // substring()方法用来获取文件后缀
                        String fileExtension = fileName.substring(fileName.lastIndexOf(".") + 1);

                        // 发送文件名和后缀到远程服务器
                        // DataOutputStream用来写入基本数据类型的数据
                        DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
                        // writeUTF()用来写入UTF格式的字符串
                        dataOutputStream.writeUTF("sync");
                        dataOutputStream.writeUTF(fileName);
                        // writeUTF()用来写入UTF格式的文件扩展名
                        dataOutputStream.writeUTF(fileExtension);

                        // 将文件的字节流发送到远程服务器
                        byte[] buffer = new byte[1024];
                        int bytesRead;
                        // read()方法用来读取文件字节流
                        while ((bytesRead = fileInputStream.read(buffer)) != -1) {
                            // write()方法用来写入文件字节流
                            outputStream.write(buffer, 0, bytesRead);
                        }

                        // 关闭文件输入流和Socket连接
                        fileInputStream.close();
                        dataOutputStream.close();
                        socket.close();

                        System.out.println("文件同步完成：" + localFilePath);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        // 启动线程
        syncFileThread.start();
    }
}
